/**
 * @author CH_ywx
 * @Date 2023-06-01
 * @Description
 */
package io.xccit;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource;

/**
 *@author CH_ywx
 *@Date 2023-06-01
 *@Description 自定义登陆认证Realm
 */
public class CustomLoginRealm extends AuthenticatingRealm {
    /**
     * 自定义登录认证方法,shiro的login()底层会调用该方法进行认证
     * 需要配置自定义Realm生效,可以在ini中配置,也可以在SpringBoot中配置
     * 该方法只是获取进行比对的信息,认证逻辑还是按照shiro底层认证逻辑进行认证
     * @param authenticationToken token对象
     * @return 校验逻辑对象
     * @throws AuthenticationException 认证异常
     */
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //获取身份信息
        String principal = (String) authenticationToken.getPrincipal();
        //获取凭证信息
        String credentials = new String((char[])authenticationToken.getCredentials());
        System.out.println("认证用户信息:"+principal+"---"+credentials);
        //获取数据库中存储的信息(三次加盐迭代后的密码)
        if (principal.equals("xccit")){
            String password = "952db7655f15f041e015819c1f50e926";//模拟数据库查出来的三次加盐迭代后的密码
            /**
             *身份信息,
             * 数据库查出来的密码,
             * 数据库密码字段的加盐信息
             * 凭证信息
             */
            //封装校验逻辑对象
            AuthenticationInfo info = new SimpleAuthenticationInfo(
                    authenticationToken.getPrincipal(),
                    password,
                    ByteSource.Util.bytes("2001"),
                    authenticationToken.getPrincipal().toString()
            );
            return info;
        }
        return null;
    }
}
